<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 我们要拷贝一个对象(深拷贝和浅拷贝)的做法

      // 浅拷贝是直接将一个新变量等于要拷贝的变量  如果拷贝的变量是对象则拷贝的堆地址，只要其中一个数据改变了都会变。改变的是同一个对象

      // 深拷贝是将拷贝的对象里的内容复制到 另一个变量里 是拷贝内容，不是堆地址

      //深拷贝方法 1.通过转换json格式 赋值给新对象  然后再转换回来  (有部分的数据会丢失 ：函数 、 undefined 、 Symbol 、 map 、 set .)

      // 深拷贝方法 2 通过创建一个新对象或者新数组 利用 for in 循环将内容赋值给 新的空对象或者空数组 问题就是如果是对象里的属性是对象 拷贝就会拷贝了一层 里面的内容就没有拷贝  所以利用递归拷贝

      function deepCopy(obj) {
        var obj2 =
          Object.prototype.toString.call(obj) === "[object Array]" ? [] : {};
        for (var key in obj) {
          if (obj.hasOwnProperty(key)) {
            // 判断是否是对象的自身属性
            // obj[key] : 张三、20、{myname:"李四"}
            if (typeof obj[key] === "object") {
              // 证明键值是 对象或者是数组
              // newobj = copy({myname:"李四"})
              // obj['myobj'] = newobj
              obj2[key] = deepCopy(obj[key]);
            } else {
              // 简单数据类型
              obj2[key] = obj[key];
            }
          }
        }
        return obj2;
      }
    </script>
  </body>
</html>
